package com.itheima.反射reflect.反射核心案例_使用场景;

import java.io.InputStreamReader;
import java.lang.reflect.Method;
import java.util.Properties;

/*
需求：基于反射设计一套程序，能够实现代码不变，改改配置文件就能动态切换运行不同
类对象的不同方法
 */
public class Test {
    public static void main(String[] args) throws Exception{
        //构建一个Properties,读取prop.properties中的配置信息进内存
        Properties prop = new Properties();

       // prop.load(ClassLoader.getSystemClassLoader().getResourceAsStream("prop.properties"));
   //  prop.load(Test.class.getClassLoader().getResourceAsStream("prop.properties"));

        //用字节转字符把中文路径名转换为GBK格式
        prop.load(new InputStreamReader(ClassLoader.getSystemClassLoader().getResourceAsStream("prop.properties"),"GBK"));
  //  prop.load(new InputStreamReader(Test.class.getClassLoader().getResourceAsStream("prop.properties"),"GBK"));
        //通过Class属性获取Class对象
        Class clazz = Class.forName(prop.getProperty("className"));
        //反射获取要运行的方法对象
        Method method = clazz.getDeclaredMethod(prop.getProperty("methodName"));
        //暴力反射
        method.setAccessible(true);
        //反射构建类的对象
        Object obj = clazz.newInstance();
        //反射调用方法
        method.invoke(obj);


    }
}


class Student{
    public void study(){
        System.out.println("学生爱学习");
    }
    private void play(){
        System.out.println("学生更爱打游戏");
    }
}

class Teacher{
    public void teach(){
        System.out.println("老师爱上课");
    }
    private void play(){
        System.out.println("老师也爱玩游戏");
    }
}

class Worker{
    public void work(){
        System.out.println("工人爱工作");
    }
    private void play(){
        System.out.println("工人更爱玩游戏");
    }
}







